package mac5855.app.dao;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import mac5855.app.models.Categoria;
import mac5855.app.models.Favorito;
import mac5855.app.models.GerenciadorDePerguntas;
import mac5855.app.models.Pergunta;
import mac5855.app.models.Usuario;

public class JpaPerguntaDAO implements PerguntaDAO {

	@Override
	public void create(Pergunta newInstance) {

		EntityManager em;
		em = JpaDAOFactory.createConnection();
		em.getTransaction().begin();
		em.persist(newInstance);
		em.getTransaction().commit();

		Categoria categoria = em.find(Categoria.class, newInstance.getCategoria().getId());

		newInstance.setCategoria(categoria);

		Usuario usuario = em.find(Usuario.class, newInstance.getUsuario().getEmail());
		newInstance.setUsuario(usuario);

		GerenciadorDePerguntas.getInstancia().adicionaPergunta(newInstance);

		JpaDAOFactory.releaseConnection(em);
	}

	@Override
	public void delete(Integer id) {
		EntityManager em;
		em = JpaDAOFactory.createConnection();
		em.getTransaction().begin();
		Pergunta pergunta = new Pergunta();
		pergunta.setId(id);
		em.remove(pergunta);
		em.getTransaction().commit();
		JpaDAOFactory.releaseConnection(em);
	}

	@Override
	public Pergunta find(Pergunta object) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Pergunta[] findAll() {
		EntityManager em;
		em = JpaDAOFactory.createConnection();
		List<Pergunta> perguntas = em.createQuery("select p from Pergunta p").getResultList();

		return perguntas.toArray(new Pergunta[perguntas.size()]);
	}

	@Override
	public void update(Pergunta transientObject) {
		// TODO Auto-generated method stub

	}

	@Override
	public Pergunta findById(Integer id) {
		EntityManager em;
		em = JpaDAOFactory.createConnection();
		em.getTransaction().begin();
		Pergunta pergunta = em.find(Pergunta.class, id);
		em.getTransaction().commit();
		JpaDAOFactory.releaseConnection(em);
		return pergunta;
	}

	@Override
	public Pergunta[] findAllByTituloAndCategoria(String titulo, Integer categoria_id) {

		EntityManager em;
		em = JpaDAOFactory.createConnection();

		List<Pergunta> perguntas;

		String sql = (categoria_id != null) ? " and p.categoria_id = ?" : "";

		Query q = em.createQuery("select p from Pergunta p where (p.titulo like ?)" + sql);

		q.setParameter(1, "%" + titulo + "%");
		q.setParameter(2, categoria_id);

		perguntas = q.getResultList();

		JpaDAOFactory.releaseConnection(em);

		return (Pergunta[]) perguntas.toArray(new Pergunta[perguntas.size()]);

	}

	@Override
	public Pergunta[] findByCategoriaId(int id) {

		EntityManager em;
		em = JpaDAOFactory.createConnection();

		List<Pergunta> perguntas;

		Query q = em.createQuery("select p from Pergunta p where (p.categoria_id = ?)");

		q.setParameter(1, id);

		perguntas = q.getResultList();

		JpaDAOFactory.releaseConnection(em);

		return (Pergunta[]) perguntas.toArray(new Pergunta[perguntas.size()]);

	}

	@Override
	public void vote(int id, boolean voteThrough) {

		EntityManager em;
		em = JpaDAOFactory.createConnection();

		String column = (voteThrough) ? "voto_positivo" : "voto_negativo";

		Pergunta pergunta = em.find(Pergunta.class, id);

		if (voteThrough)
			pergunta.setVotoPositivo(pergunta.getVotoPositivo() + 1);
		else
			pergunta.setVotoNegativo(pergunta.getVotoNegativo() + 1);

		em.getTransaction().begin();

		em.persist(pergunta);

		em.getTransaction().commit();

		JpaDAOFactory.releaseConnection(em);

	}

	@Override
	public void addFavorite(int id, String userEmail) {

		EntityManager em;
		em = JpaDAOFactory.createConnection();

		em.getTransaction().begin();

		Favorito favorito = new Favorito();
		favorito.setPergunta_id(id);
		favorito.setUsuario_id(userEmail);

		em.persist(favorito);

		em.getTransaction().commit();

		JpaDAOFactory.releaseConnection(em);
	}

	@Override
	public boolean isFavorite(int id, String userEmail) {

		EntityManager em;
		em = JpaDAOFactory.createConnection();

		List<Favorito> favoritos;

		Query q = em.createQuery("select p from Favorito p where p.usuario_id = ? and p.pergunta_id = ?");

		q.setParameter(1, userEmail);
		q.setParameter(2, id);

		favoritos = q.getResultList();

		JpaDAOFactory.releaseConnection(em);

		return favoritos.size() > 0;
	}

}
